<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

</body>
<script src="lib/Promise.js"></script>
<script>

  /**
   * 使用自定义的Promise, 来创建一个实例对象promise
   * 指定回调函数的参数为resolve和reject, 这两个参数不需要自己提供, 有Promise构造内部提供
   *
   * @type {Promise}
   */
  const promise = new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(1)
      // console.log('--after改变状态 reject之后')
      // reject(1)
    }, 100)

    // resolve(1)
    // reject(1)
  });

  // 给改变状态添加延时, 实现先添加回调函数, 在改变状态
  // --> then方法里面的回调函数执行时机, 是在改变状态之后
  // promise.then(value => {
  //   console.log('onResolved1()', value)
  // }, reason => {
  //   console.log('onRejected1()', reason)
  // })
  // promise.then(value => {
  //   console.log('onResolved2()', value)
  // }, reason => {
  //   console.log('onRejected2()', reason)
  // })
  //
  // console.log('promise.then()之后')

  promise.then(value => {
    console.log('onResolved01()', value)
    // 返回值为2, 是一个非promise对象. 则then()返回的promise对象状态为resolved, 值为2
    // return 2
    // 不显式写return语句, 返回值为undefined, 新promise的resolved值为undefined
    // console.log('onResolved01()', value)

    return Promise.resolve(3)   // 返回值为一个Promise实例对象, 且状态为resolve
    // return Promise.reject(4)    // 返回值为一个Promise实例对象, 且状态为reject
    // throw 5   // 手动抛出异常, 新的promise变为rejected, reason为抛出异常
  }, reason => {
    console.log('onRejected01()', reason)
  }).then(value => {
    console.log('onResolved02()', value)
    throw 999
  }, reason => {
    console.log('onRejected02()', reason)
  }).catch(reason => {
    console.log('onRejected03()', reason)
  })
</script>
</html>
